package app.engine.solucoes.request.dao;

import java.util.ArrayList;
import java.util.List;

import javax.jdo.PersistenceManager;

import app.engine.solucoes.request.beans.Empresa;
import app.engine.solucoes.request.beans.Pergunta;
import app.engine.solucoes.request.beans.Resposta;
import app.engine.solucoes.request.beans.Usuario;
import app.engine.solucoes.request.exception.UsuarioJaInativoExceprion;
import app.engine.solucoes.request.servico.PMF;

import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.sun.corba.se.impl.ior.OldPOAObjectKeyTemplate;

public class AppDAO {

	public void insert(Object obj) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
        try {
            pm.makePersistent(obj);
        } finally {
            pm.close();
        }
	}

	public Empresa updateEmpresaUsuario(Object id, Usuario usuario) {
	    PersistenceManager pm = PMF.get().getPersistenceManager();
	    Empresa empresa = null;
	    try {
	    	pm.makePersistent(usuario);
	        empresa = pm.getObjectById(Empresa.class, id);
	        usuario.setEmpresa(empresa.getId());
	    } catch (Exception e) {
	    	return null;
	    } finally {
	    	pm.close();
	    }
	    return empresa;
	}
	
	public Object select(Class<?> classe, Object id) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Object obj = null;
		try {
			obj = pm.getObjectById(classe, id);
		} catch (Exception e) {
			return null;
		} finally {
	        pm.close();
	    }
		return obj;
	}
	
	public Object selectByLogin(Class<?> classe, String login) {
		PersistenceManager pm = PMF.get().getPersistenceManager();

		try {
			Key k = KeyFactory.createKey(classe.getSimpleName(), login);
		    return pm.getObjectById(Usuario.class, k);
		} catch (Exception e) {
			System.err.print(e.getMessage());
			return null;
		} finally {
	        pm.close();
	    }
	}


	@SuppressWarnings("unchecked")
	public List<Object> selectAll(Class<?> classe) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		String query = "select from " + classe.getName();
		List<Object> ret = new ArrayList<Object>();
		List<Object> listTemp = new ArrayList<Object>();
		try {
			listTemp = (List<Object>) pm.newQuery(query).execute();
			for (Object object : listTemp) {
				ret.add(object);
			}
		} catch (Exception e) {
			System.err.print(e.getMessage());
			return null;
		} finally {
			pm.close();
		}
		return ret;
	}
	
	public void delete(Object obj) {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		try {
	    	pm.deletePersistent(obj);
	    } finally {
	    	pm.close();
	    }
	}

	public void updateExcluiUser(String login, Boolean situacao) throws UsuarioJaInativoExceprion {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Usuario usuario = null;
		try {
			Key k = KeyFactory.createKey(Usuario.class.getSimpleName(), login);
		    usuario = pm.getObjectById(Usuario.class, k);
		    if (usuario.getAtivo()) {
		    	usuario.setAtivo(situacao);
		    } else {
		    	throw new UsuarioJaInativoExceprion();
		    }
		} finally {
	        pm.close();
	    }
	}
	
	public void updateExcluiUserEmp(String login, Boolean situacao) throws UsuarioJaInativoExceprion {
		PersistenceManager pm = PMF.get().getPersistenceManager();
		Usuario usuario = null;
		try {
			Key k = KeyFactory.createKey(Usuario.class.getSimpleName(), login);
		    usuario = pm.getObjectById(Usuario.class, k);
		    if (usuario.getAtivo()) {
	    		Empresa empresa = pm.getObjectById(Empresa.class, usuario.getEmpresa());
		    	empresa.setAtiva(Boolean.FALSE);
		    	usuario.setAtivo(situacao);
		    } else {
		    	throw new UsuarioJaInativoExceprion();
		    }
		} finally {
	        pm.close();
	    }
	}
	
	public void updateUser(Usuario usuario) {
		PersistenceManager pm = PMF.get().getPersistenceManager();

		try {
			Key k = KeyFactory.createKey(Usuario.class.getSimpleName(), usuario.getLogin());
		    Usuario oldUsuario = pm.getObjectById(Usuario.class, k);
		    oldUsuario.setAtivo(usuario.getAtivo());
		    oldUsuario.setNomeUsuario(usuario.getNomeUsuario());
		    oldUsuario.setEmail(usuario.getEmail());
		    oldUsuario.setEhModerador(usuario.getEhModerador());
		    oldUsuario.setSenha(usuario.getSenha() != null && usuario.getSenha().equals("") ? oldUsuario.getSenha() : usuario.getSenha());
		} catch (Exception e) {
			System.err.print(e.getMessage());
		} finally {
	        pm.close();
	    }
	}
	
	public void updateUserEmp(Usuario usuario) {
		PersistenceManager pm = PMF.get().getPersistenceManager();

		try {
			Key k = KeyFactory.createKey(Usuario.class.getSimpleName(), usuario.getLogin());
		    Usuario oldUsuario = pm.getObjectById(Usuario.class, k);
		    oldUsuario.setAtivo(usuario.getAtivo());
		    oldUsuario.setEmail(usuario.getEmail());
		    oldUsuario.setSenha(usuario.getSenha() != null && usuario.getSenha().equals("") ? oldUsuario.getSenha() : usuario.getSenha());
		    
		    Empresa empresa = pm.getObjectById(Empresa.class, oldUsuario.getEmpresa());
		    empresa.setAtiva(usuario.getAtivo());
		    
		} catch (Exception e) {
			System.err.print(e.getMessage());
		} finally {
	        pm.close();
	    }
	}

	public void updateResposta(Resposta resposta) {
		PersistenceManager pm = PMF.get().getPersistenceManager();

		try {
		    Resposta oldResposta = pm.getObjectById(Resposta.class, resposta.getId());
		    oldResposta.setDataCriacao(oldResposta.getDataCriacao() != null ? oldResposta.getDataCriacao() : resposta.getDataCriacao());
		    oldResposta.setTxtResposta(resposta.getTxtResposta());
		    oldResposta.setIdPergunta(resposta.getIdPergunta());
		    oldResposta.setModerador(resposta.getModerador());
		    oldResposta.setUsuarioResposta(resposta.getUsuarioResposta());
		    oldResposta.setAprovada(resposta.getAprovada());
		} catch (Exception e) {
			System.err.print(e.getMessage());
		} finally {
	        pm.close();
	    }
		
	}

	public void updatePergunta(Pergunta pergunta) {
		PersistenceManager pm = PMF.get().getPersistenceManager();

		try {
		    Pergunta oldPergunta = pm.getObjectById(Pergunta.class, pergunta.getId());
		    oldPergunta.setTxtPergunta(pergunta.getTxtPergunta());
		    oldPergunta.setAprovada(pergunta.getAprovada());
		} catch (Exception e) {
			System.err.print(e.getMessage());
		} finally {
	        pm.close();
	    }
		
	}
	
}
